//
//  MediaLibraryAccess_05ViewController.m
//  MediaLibraryAccess_05
//
//  Created by 畑圭輔 on 10/02/07.
//  Copyright __MyCompanyName__ 2010. All rights reserved.
//

#import "MediaLibraryAccess_05ViewController.h"
#import "SongPlayerViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@interface MediaLibraryAccess_05ViewController( Private )

- (void) showPlayer : (MPMediaItem *)item;

@end


@implementation MediaLibraryAccess_05ViewController

@synthesize items = _items,isShowPlayer = _isShowPlayer;

#pragma mark -
#pragma mark iPodControl Action

// 曲を再生
- (IBAction) playSong {
	[_ipod play];
}

// 曲を一時停止
- (IBAction) pauseSong {
	[_ipod pause];
}

// 曲を停止
- (IBAction) stopSong {
	_isShowPlayer = NO;
	
	[_ipod stop];
	[self showPlayer:nil];
	UIView *playerView = [self.view viewWithTag:kSongPlayerTag];
	[playerView removeFromSuperview];
}

// 曲をシークした時
- (IBAction) seekedSongTime {
	
	if( !self.isShowPlayer ) {
		return;
	}
	
	// シークした位置から再生
	_ipod.currentPlaybackTime = _songSeekBar.value;
}


/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
	
	// searchbar init
	_searchSongBar.showsCancelButton = YES;

	// 曲のタイトルでグルーピングされたデータタイプが"Music"のクエリーを取得します。
	_songQuery = [[MPMediaQuery songsQuery] retain];

	// NSOperationQueueを生成します。
	// 一度に実行できるスレッドを１つに限定します。
	_searchQueue = [[NSOperationQueue alloc] init];
	[_searchQueue setMaxConcurrentOperationCount:1];
	
	// プレイヤーは、非表示
	_isShowPlayer = NO;

    [super viewDidLoad];
}

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
	// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
	
	// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
	// Release any retained subviews of the main view.
	// e.g. self.myOutlet = nil;
}

// プレイヤーを表示
- (void) showPlayer:(MPMediaItem *)item
{
	BOOL open = NO;
	if( self.isShowPlayer )
		open = YES;
	
	// テーブルビューのサイズを調整する
	const float playerHeight = (open) ? 120.0f : -120.0f;
	CGRect rc = _searchResult.frame;

	// 表示アニメーション
	[UIView beginAnimations:@"playerin" context:NULL];
	[_searchResult setFrame:CGRectMake( 0, 
									   rc.origin.y + playerHeight, 
									   rc.size.width, 
									   rc.size.height - playerHeight)];
	[UIView commitAnimations];
	
	// プレイヤーが表示されている時
	if( self.isShowPlayer ) {
		
		UIView *player = [[[NSBundle mainBundle] loadNibNamed:@"SongPlayerView" 
											owner:self 
											options:nil] objectAtIndex:0];
		[player setFrame:CGRectMake(0, rc.origin.y, 320.0f, playerHeight)];
		[player setTag:kSongPlayerTag];
		[self.view addSubview:player];
		
		if( item != nil ) {
			_songTitle.text = [item valueForProperty:MPMediaItemPropertyTitle];
			NSNumber *duration = [item valueForProperty:MPMediaItemPropertyPlaybackDuration];
			_songSeekBar.value = 0.0f;
			_songSeekBar.minimumValue = 0.0f;
			_songSeekBar.maximumValue = [duration doubleValue];
		}
	}
}

- (void)dealloc {
	
	[_ipod release];
	[_items release];
	[_songQuery release];
	[_searchQueue cancelAllOperations];
	[_searchQueue release];
    [super dealloc];
}

#pragma mark -
#pragma mark SearchBar Delegate

// キーボードを閉じる
- (void) closeKeyboard {
	[_searchSongBar resignFirstResponder];
}

// キャンセルボタンが押された時
- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar {
	[_searchQueue cancelAllOperations];
	[self closeKeyboard];
}

// 検索ボタンが押された時
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
	// 検索開始
	NSLog(@"%@",searchBar.text);
	SongSearchOperation *op = [[SongSearchOperation alloc] initWithSearchItem:searchBar.text searchQuery:_songQuery];
	op.resultsDeleate = self;
	[_searchingIndicatorView startAnimating];
	[_searchQueue addOperation:op];
	[op release];
}

#pragma mark -
#pragma mark SongSearchOperationResultsDelegate

// NSOperationが終了した時に呼ばれるデリゲート
-(void) operationFinishedSearch : (SongSearchOperation *)op {
	
	// キャンセルされている時は即座に抜ける
	if( [op isCancelled] )
		return;
	
	if( [NSThread isMainThread] )
	{
		_items = [op.items retain];
		[_searchingIndicatorView stopAnimating];
		[_searchResult reloadData];
	}else {
		// メインスレッドじゃない時：UIKitの操作は、メインスレッド以外では行ってはいけない
		[self performSelectorOnMainThread:@selector(operationFinishedSearch:) 
				withObject:op waitUntilDone:NO];
	}
}


#pragma mark -
#pragma mark TableView Delegate

// テーブルビューセルの高さ
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  {
	return kSongSearchResultTableViewCellHeight;
}

#pragma mark -
#pragma mark TableView DataSource

// テーブルビューセルの数
-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section  {
	return [_items count];
}

// テーブルビューセルを生成し、設定する
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{	
	NSUInteger		row		= indexPath.row;
	static NSString *reuseID = @"songSearchResultID";
	
	// try to recycle!
	UITableViewCell	*cell	= (UITableViewCell*) [tableView dequeueReusableCellWithIdentifier:reuseID];
	
	if( cell == nil ) {
		cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseID] autorelease];
	}
	else {
	}
	
	MPMediaItem *item = [_items objectAtIndex:row];
	cell.textLabel.text = [item valueForProperty:MPMediaItemPropertyTitle];
	return cell;
}

// テーブルビューセルを選択した時
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
	NSUInteger row = indexPath.row;
	if( row < 0 )
		return;

	[tableView deselectRowAtIndexPath:indexPath animated:YES];
	
	// 選択した位置からアイテムを取得する
	MPMediaItem *item = [_items objectAtIndex:row];
	
	// プレイヤーが表示されていないなら
	if( !self.isShowPlayer ) {
		
		_isShowPlayer = YES;
		// MPMediaItemCollectionに変換
		// 一旦、MPMediaItemをNSArrayに変換して、NSArrayからMPMediaItemCollectionに変換します。
		NSArray *mm_items = [NSArray arrayWithObject:item];
		MPMediaItemCollection* collection = [MPMediaItemCollection collectionWithItems:mm_items];
		
		NSString *title = [item valueForProperty:MPMediaItemPropertyTitle];

		// プレイヤーを生成する
		_ipod = [MPMusicPlayerController applicationMusicPlayer];
		
		// コレクションをセットする
		[_ipod setQueueWithItemCollection:collection];

		// リピートモードをワンショット再生に設定する
		_ipod.repeatMode = MPMusicRepeatModeNone;

		// プレイヤーを表示する
		[self showPlayer:item];
	}
	
	// キーボードを閉じる
	[_searchSongBar resignFirstResponder];
}

@end
